/*
    GNU GENERAL LICENSE
    Copyright (C) 2006 The Lobo Project. Copyright (C) 2014 - 2016 Lobo Evolution

    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public
    License as published by the Free Software Foundation; either
    verion 3 of the License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    General License for more details.

    You should have received a copy of the GNU General Public
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    

    Contact info: lobochief@users.sourceforge.net; ivan.difrancesco@yahoo.it
 */
package org.lobobrowser.clientlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.net.URL;
import java.util.Date;
import java.util.Iterator;

import org.lobobrowser.ua.RequestType;

/**
 * Represents a URL response such as an HTTP or file protocol response.
 */
public interface ClientletResponse {

    /** Gets the response url.
	 *
	 * @return the response url
	 */
    URL getResponseURL();

    /** Gets the last request method.
	 *
	 * @return the last request method
	 */
    String getLastRequestMethod();

    /**
     * Gets a response header.
     *
     * @param name
     *            The header name.
     * @return the header
     */
    String getHeader(String name);

    /**
     * Gets all values for a particular header.
     *
     * @param name
     *            The header name.
     * @return the headers
     */
    String[] getHeaders(String name);

    /** Gets the header names.
	 *
	 * @return the header names
	 */
    Iterator getHeaderNames();

    /** Gets the input stream.
	 *
	 * @return the input stream
	 * @throws IOException
	 *             Signals that an I/O exception has occurred.
	 */
    InputStream getInputStream() throws IOException;

    /** Gets the content type.
	 *
	 * @return the content type
	 */
    String getContentType();

    /** Gets the mime type.
	 *
	 * @return the mime type
	 */
    String getMimeType();

    /**
     * A convenience method used to match parameters provided against the
     * response mime-type or the "file extension" of the response URL's file
     * path. The file extension is matched only when the mime type of the
     * response is either <code>application/octet-stream</code>,
     * <code>content/unknown</code>, or not provided.
     *
     * @param mimeType
     *            A mime type, e.g. <em>application/x-acme</em>.
     * @param fileExtension
     *            A collection of file extensions, each starting with a dot,
     *            e.g. <em>new String[] {".acme", ".acm"}</em>.
     * @return True if the navigator considers there is a match.
     */
    boolean matches(String mimeType, String[] fileExtension);

    /** Gets the content length.
	 *
	 * @return the content length
	 */
    int getContentLength();

    /** Checks if is from cache.
	 *
	 * @return true, if is from cache
	 */
    boolean isFromCache();

    /** Gets the charset.
	 *
	 * @return the charset
	 */
    String getCharset();

    /** Checks if is charset provided.
	 *
	 * @return true, if is charset provided
	 */
    boolean isCharsetProvided();

    /** Gets the response code.
	 *
	 * @return the response code
	 * @throws IOException
	 *             Signals that an I/O exception has occurred.
	 */
    int getResponseCode() throws IOException;

    /** Gets the response message.
	 *
	 * @return the response message
	 * @throws IOException
	 *             Signals that an I/O exception has occurred.
	 */
    String getResponseMessage() throws IOException;

    /** Checks if is cacheable.
	 *
	 * @return true, if is cacheable
	 */
    boolean isCacheable();

    /** Checks if is new navigation action.
	 *
	 * @return true, if is new navigation action
	 */
    boolean isNewNavigationAction();

    /**
     * If available, gets an object previously persisted along with the cached
     * document.
     *
     * @param classLoader
     *            A class loader that can load an object of the type expected.
     * @return the persistent cached object
     * @see #setNewPersistentCachedObject(Serializable)
     */
    Object getPersistentCachedObject(ClassLoader classLoader);

    /** Sets the new persistent cached object.
	 *
	 * @param object
	 *            the new new persistent cached object
	 */
    void setNewPersistentCachedObject(Serializable object);

    /** Gets the transient cached object.
	 *
	 * @return the transient cached object
	 */
    Object getTransientCachedObject();

    /**
     * Caches an object in main memory, provided caching is allowed and there's
     * enough memory to do so. The object is associated with the current
     * response URL.
     *
     * @param object
     *            An object.
     * @param approxSize
     *            The approximate byte size the object occupies in memory. Note
     *            that values less than the size of the response in bytes are
     *            assumed to be in error.
     */
    void setNewTransientCachedObject(Object object, int approxSize);

    /** Gets the transient cached object size.
	 *
	 * @return the transient cached object size
	 */
    int getTransientCachedObjectSize();

    /** Gets the date.
	 *
	 * @return the date
	 */
    Date getDate();

    /** Gets the request type.
	 *
	 * @return the request type
	 */
    RequestType getRequestType();
}
